使用FlexGrid > 分组 > 分组数据(使用ICollectionView) |
ICollectionView接口包含对分组的支持,这将允许您创建分层的数据视图。例如,在上面的示例中,如果要对客户按照不同的国家和城市进行分组,您只需要简单地将生成Grid数据的部分修改为以下:
C# |
拷贝代码
|
---|---|
List<Customer> list = GetCustomerList(); PagedCollectionView view = new PagedCollectionView(list); using (view.DeferRefresh()) { view.GroupDescriptions.Clear(); view.GroupDescriptions.Add(new PropertyGroupDescription("Country")); view.GroupDescriptions.Add(new PropertyGroupDescription("Active")); } _flexGrid.ItemsSource = view; |
表达式 using(view.DeferRefresh()) 为可选。它通过挂起来自于数据源的通知直至全部的分组设置完毕,以提高性能。
下图显示执行的结果:
数据项按照不同的国家以及其活动的区域进行分组。用户可以单击分组Header上的图标以折叠或者展开分组,就像他们在操作一个TreeView控件一样。
如果您希望在Grid层面禁用分组,请设置Grid的GroupRowPosition属性的值为GroupRowPosition.None(其他可用的选项为AboveData以及BelowData)。
由ICollectionView类提供的分组机制简单但功能强大。每一个级别的分组由PropertyGroupDescription对象定义。该对象允许您选择用于进行分组的属性,以及一个ValueConverter用来决定如何在分组时使用这个属性。
例如,如果我们想按国家的首字母来分组,则可以简单地修改代码如下:
C# |
拷贝代码
|
---|---|
List<Customer> list = GetCustomerList(); PagedCollectionView view = new PagedCollectionView(list); using (view.DeferRefresh()) { view.GroupDescriptions.Clear(); view.GroupDescriptions.Add(new PropertyGroupDescription("Country")); view.GroupDescriptions.Add(new PropertyGroupDescription("Active")); var gd = view.GroupDescriptions[0] as PropertyGroupDescription; gd.Converter = new CountryInitialConverter(); } _flexGrid.ItemsSource = view; |
CountryInitialConverter类实现了IValueConverter接口。它返回国家名称的第一个英文字母,使用该字母进行分组而不再是使用完整的国家名称。
C# |
拷贝代码
|
---|---|
// 按照首字母对国家进行分组的转换器 class CountryInitialConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { return ((string)value)[0].ToString().ToUpper(); } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } } |
在完成这个小小的变化之后,客户将按照所在国家的第一个字母而不再是按照国家名称进行分组:
注意,该分组行将显示该分组的信息(依照分组的属性以及其值,以及其中包含的项目个数)。
为定制此信息,可以创建一个新的IValueConverter 类并将其指定给Grid的GroupHeaderConverter 属性。
例如,默认的分组Header转换器(显示如图片所示信息的那个默认转换器)的实现如下所示:
C# |
拷贝代码
|
---|---|
// 用作格式化显示分组标题的类 public class GroupHeaderConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { var gr = parameter as GroupRow; var group = gr.Group; if (group != null && gr != null && targetType == typeof(string)) { var desc = gr.Grid.View.GroupDescriptions[gr.Level] as PropertyGroupDescription; return desc != null ? string.Format("{0}: {1} ({2:n0} items)", desc.PropertyName, group.Name, group.ItemCount) : string.Format("{0} ({1:n0} items)", group.Name, group.ItemCount); } return value; } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { return value; } } |